//////////////////////////////////////////////////////////////////////////

#ifndef _ACCEPTOR_H_
#include "acceptor.h"
#endif

//////////////////////////////////////////////////////////////////////////

#ifndef _BOOSTSERVICE_H_
#include "boostservice.h"
#endif

#include <iostream>

//////////////////////////////////////////////////////////////////////////


Acceptor::Acceptor( int _port )
: m_Acceptor( BoostService::GetIOService(), 
              boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), _port) )
{
    m_UDPServer.Start(_port);
}


//////////////////////////////////////////////////////////////////////////


Acceptor::~Acceptor()
{
}


//////////////////////////////////////////////////////////////////////////


void Acceptor::Start()
{
    // Prepare new socket
    m_Socket.reset( new boost::asio::ip::tcp::socket( BoostService::GetIOService() ) );

    // Accept TCP connection
    m_Acceptor.async_accept( *( m_Socket.get() ),
        boost::bind( &Acceptor::HandleAccept,
        this,
        boost::asio::placeholders::error ) );
}


//////////////////////////////////////////////////////////////////////////


void Acceptor::HandleAccept( const boost::system::error_code& _error )
{
    if (_error)
    {
        std::cout << "Error accept: " << _error.message() << std::endl;
        return;
    }

    NotifyObservers(Observer::NETWORK_ACCEPTED_NEW_CONNECTION);
}


//////////////////////////////////////////////////////////////////////////


const TCPSocketPtr& Acceptor::GetTCPSocket() const
{
    return m_Socket;
}


//////////////////////////////////////////////////////////////////////////


UDPServer& Acceptor::GetUDPServer()
{
    return m_UDPServer;
}


//////////////////////////////////////////////////////////////////////////
